package qqclient.service;

import qqcommon.Message;
import qqcommon.MessageType;

import java.io.*;
import java.net.Socket;

//客户端线程类
public class ClientConnectThread extends Thread {
    //    由于在业务逻辑上需要用到该线程对应的socket和user，因此定义为成员属性
//    持有与服务端通信的socket对象
    private Socket socket;

    public ClientConnectThread(Socket socket) {
        this.socket = socket;
    }

    //    获取当前线程对应的socket
    public Socket getSocket() {
        return socket;
    }


    //客户端的业务逻辑
    @Override
    public void run() {
        while (true) {
            try {
//                监听当前线程对应socket从服务端发来的信息，若无信息，则阻塞
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());//当客户端服务端退出时，线程卡阻塞在此处

                Message message = (Message) ois.readObject();
//                根据消息种类跳转
                switch (message.getMesType()) {
                    case MessageType.MESSAGE_RET_ONLINE_FRIEND://获取服务端返回的在线用户列表
                        //                    在线用户由服务端线程集合中获取，理论上一定不为空，至少为1个用户
                        String[] s = message.getContent().split(" ");
                        if (s.length > 0) {
                            System.out.println("\n===当前在线用户列表====");
                            for (int i = 0; i < s.length; i++) {
                                System.out.println("用户" + i + ": " + s[i]);
                            }
                        }
                        break;
                    case MessageType.MESSAGE_TO_ONE_MES://从服务端接收到私聊信息
                        System.out.println("\n用户" + message.getSender() + "对你说：" + message.getContent());
                        break;
                    case MessageType.MESSAGE_TO_ALL_MES://从服务端接收到群聊消息
                        System.out.println("\n用户" + message.getSender() + "群发了：" + message.getContent());
                        break;
                    case MessageType.MESSAGE_FILE_TO_ONE_MES://从服务端接收到文件消息
                        System.out.println("\n用户" + message.getSender() + "向你发送了文件：" + message.getFileName() + ",文件大小为：" + message.getFileSize()+"KB");
                        FileOutputStream fos = new FileOutputStream(new File(message.getFileDes(),message.getFileName()));
                        fos.write(message.getFileContent());//将文件字节数组写入到输出流中
                        System.out.println("文件传输完毕");
                        fos.close();//关闭文件输出流
                        break;
                    case MessageType.MESSAGE_SEVER_MES://服务端推送的消息
                        System.out.println("\n服务端向你推送了消息：" + message.getContent());
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
